<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2012 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------
// $Id: Cache.class.php 2702 2012-02-02 12:35:01Z liu21st $


/**
 +------------------------------------------------------------------------------
 * 缓存管理类
 +------------------------------------------------------------------------------
 * @category   Think
 * @package  Think
 * @subpackage  Util
 * @author    liu21st <liu21st@gmail.com>
 * @version   $Id: Cache.class.php 2702 2012-02-02 12:35:01Z liu21st $
 +------------------------------------------------------------------------------
 */
class Cache {
	
	/**
     +----------------------------------------------------------
	 * 是否连接
     +----------------------------------------------------------
	 * @var string
	 * @access protected
     +----------------------------------------------------------
	 */
	protected $connected;
	
	/**
     +----------------------------------------------------------
	 * 操作句柄
     +----------------------------------------------------------
	 * @var string
	 * @access protected
     +----------------------------------------------------------
	 */
	protected $handler;
	
	/**
     +----------------------------------------------------------
	 * 缓存连接参数
     +----------------------------------------------------------
	 * @var integer
	 * @access protected
     +----------------------------------------------------------
	 */
	protected $options = array ();
	
	/**
     +----------------------------------------------------------
	 * 连接缓存
     +----------------------------------------------------------
	 * @access public
     +----------------------------------------------------------
	 * @param string $type 缓存类型
	 * @param array $options  配置数组
     +----------------------------------------------------------
	 * @return object
     +----------------------------------------------------------
	 * @throws ThinkExecption
     +----------------------------------------------------------
	 */
	public function connect($type = '', $options = array()) {
		if (empty ( $type ))
			$type = C ( 'DATA_CACHE_TYPE' );
		$type = strtolower ( trim ( $type ) );
		$class = 'Cache' . ucwords ( $type );
		if (is_file ( CORE_PATH . 'Driver/Cache/' . $class . '.class.php' )) {
			// 内置驱动
			$path = CORE_PATH;
		} else { // 扩展驱动
			$path = EXTEND_PATH;
		}
		if (require_cache ( $path . 'Driver/Cache/' . $class . '.class.php' ))
			$cache = new $class ( $options );
		else
			throw_exception ( L ( '_CACHE_TYPE_INVALID_' ) . ':' . $type );
		return $cache;
	}
	
	public function __get($name) {
		return $this->get ( $name );
	}
	
	public function __set($name, $value) {
		return $this->set ( $name, $value );
	}
	
	public function __unset($name) {
		$this->rm ( $name );
	}
	public function setOptions($name, $value) {
		$this->options [$name] = $value;
	}
	
	public function getOptions($name) {
		return $this->options [$name];
	}
	
	/**
     +----------------------------------------------------------
	 * 取得缓存类实例
     +----------------------------------------------------------
	 * @static
	 * @access public
     +----------------------------------------------------------
	 * @return mixed
     +----------------------------------------------------------
	 */
	static function getInstance() {
		$param = func_get_args ();
		return get_instance_of ( __CLASS__, 'connect', $param );
	}
	
	// 队列缓存
	protected function queue($key) {
		static $_handler = array ('file' => array ('F', 'F' ), 'xcache' => array ('xcache_get', 'xcache_set' ), 'apc' => array ('apc_fetch', 'apc_store' ) );
		$queue = isset ( $this->options ['queue'] ) ? $this->options ['queue'] : 'file';
		$fun = $_handler [$queue];
		$value = $fun [0] ( 'think_queue' );
		if (! $value) {
			$value = array ();
		}
		// 进列
		array_push ( $value, $key );
		if (count ( $value ) > $this->options ['length']) {
			// 出列
			$key = array_shift ( $value );
			// 删除缓存
			$this->rm ( $key );
		}
		return $fun [1] ( 'think_queue', $value );
	}
}